package agencia;

import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;

import agencia.exceptions.LugarInsuficienteException;
import com.agencia.ws.cliente.VueloWs;

public abstract class Paquete {
	
	private Long id;
	private Date fecha;
	private Temporada temporada;	
	private String nombre;
	private int cantidadPasajerosMaxima;
	private int cantidadPasajeros=0;
	protected Collection<ReservaHotelPaquete> hoteles;
	protected Collection<VueloWs> vuelos;
	protected PrecioPaquete precio;
		
	public Paquete(){
		hoteles = new LinkedList<ReservaHotelPaquete>();
		vuelos = new LinkedList<VueloWs>();
		precio = new PrecioPaquete();
	}
	public Collection<ReservaHotelPaquete> getHoteles() {
		return hoteles;
	}
	public void setHoteles(Collection<ReservaHotelPaquete> hoteles) {
		this.hoteles = hoteles;
	}
	public Collection<VueloWs> getVuelos() {
		return vuelos;
	}
	
	public void setVuelos(Collection<VueloWs> vuelos) {
		this.vuelos = vuelos;
		Iterator<VueloWs> itVuelo= vuelos.iterator();
		while (itVuelo.hasNext()){
			precio.agregarPrecioVuelo(itVuelo.next());
		}
	}

	public int getCantidadPasajerosMaxima()
	{
		return this.cantidadPasajerosMaxima;
	}
	
	public void SetCantidadPasajerosMaxima(int Max)
	{
		this.cantidadPasajerosMaxima = Max;
	}
	
	public int getCantidadPasajeros()
	{
		return this.cantidadPasajeros;
	}
	
	public void Reservar(int CantPasajeros) throws LugarInsuficienteException
	{
		if (this.cantidadPasajeros + CantPasajeros < this.cantidadPasajerosMaxima)
			this.cantidadPasajeros += CantPasajeros; 
		else
			throw new LugarInsuficienteException("No existen lugares suficientes para concretar la reserva"); 
	}
	
	public void CancelarReserva(int CantPasajeros)
	{
		this.cantidadPasajeros -= CantPasajeros; 		 
	}
	
	public abstract double determinarPrecio();

	public double getDeterminarPrecio()
	{
		return 	determinarPrecio();
	}
	
	public int getLugaresLibres(){
		return (this.cantidadPasajerosMaxima - this.cantidadPasajeros);
	}
	
	public Date getFecha() {
		return fecha;
	}
		
	public void setFecha(Date fechas) {
		this.fecha = fechas;
	}
	public Date recuperarFecha(){
		return getFecha();
	}
	public void determinarFecha(Date fecha){
		setFecha(fecha);
	}

	public String recuperarTemporada()throws Error{
		if (temporada.toString().equals("")){
			Error e = new Error("Temporada no definida");
			throw e;
		}else{
		return temporada.toString();}
	}
	public void determinarTemporada(Temporada temporada)throws Error{
		
		
		try{
			/*this.temporada.Alta.compareTo(temporada);
			this.temporada.Media.compareTo(temporada);
			this.temporada.Baja.compareTo(temporada);
			*/
			this.temporada = temporada;
		}
		catch (Exception exc){
			Error e = new Error("Tipo de temporada invalido");
			throw e;}
		
	}
	
	protected void agregarHotel(ReservaHotelPaquete hotel){
		if (hoteles==null){
			hoteles = new LinkedList<ReservaHotelPaquete>();
			hoteles.add(hotel);
		}else{
		hoteles.add(hotel);
		}
		precio.agregarPrecioHotel(hotel);
		Iterator<ReservaExcursionHotel> itReservaExcursionHotel = hotel.getExcursiones().iterator();
		while (itReservaExcursionHotel.hasNext()){
			precio.agregarPrecioExcursion(itReservaExcursionHotel.next());
		}
	}
	
	
	public LinkedList<VueloWs> getVuelosPorCiudadesFechas(String ciudadOrigen, String ciudadDestino, Date fechaVuelo){
		
		LinkedList<VueloWs> listaVuelos = new LinkedList<VueloWs>();
		
		return listaVuelos;
		
	}
	public LinkedList<Hotel> getHotelesPorCiudadFecha(Lugar lugar, Date fecha){
		
		LinkedList<Hotel> listaHoteles = new LinkedList<Hotel>();
		
		return listaHoteles;
		
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public Temporada getTemporada() {
		return temporada;
	}
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}
	public PrecioPaquete getPrecio() {
		return precio;
	}
	public void setPrecio(PrecioPaquete precio) {
		this.precio = precio;
	}
	public void setCantidadPasajerosMaxima(int cantidadPasajerosMaxima) {
		this.cantidadPasajerosMaxima = cantidadPasajerosMaxima;
	}
	public void setCantidadPasajeros(int cantidadPasajeros) {
		this.cantidadPasajeros = cantidadPasajeros;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	
}

///**
// * Setter of the property <tt>planDePago</tt>
// *
// * @param planDePago The planDePago to set.
// *
// */
//public void setPlanDePago(PlanDePago planDePago ){
//	this.planDePago = planDePago;
//}
///**
// * Getter of the property <tt>planDePago</tt>
// *
// * @return Returns the planDePago.
// * 
// */
//public PlanDePago getPlanDePago()
//{
//	return planDePago;
//}
///**
// * Setter of the property <tt>planDePago</tt>
// *
// * @param planDePago The planDePago to set.
// *
// */
//public void setPlanDePago(PlanDePago planDePago ){
//	this.planDePago = planDePago;
//}
///**
// * Getter of the property <tt>planDePago</tt>
// *
// * @return Returns the planDePago.
// * 
// */
//public PlanDePago getPlanDePago()
//{
//	return planDePago;
//}
///**
// * Setter of the property <tt>planDePago</tt>
// *
// * @param planDePago The planDePago to set.
// *
// */
//public void setPlanDePago(PlanDePago planDePago ){
//	this.planDePago = planDePago;
//}
///**
// * Getter of the property <tt>planDePago</tt>
// *
// * @return Returns the planDePago.
// * 
// */
//public PlanDePago getPlanDePago()
//{
//	return planDePago;
//}